/**
 * 函数的this
 * 在讨论 this 的指向这个问题的时候，本质上是对作用域的讨论。于是乎，首先需要明晰词法作用域和动态作用域这两个概念。
 */

let a = 1
function foo() {
    return a
}
function bar() {
    let a = 2
    return foo()
}

console.log(foo()) // 显示1
console.log(bar()) // 显示1

/**
 * 这是为什么，因为在js中规定，变量的定义域是从“定义”函数的地方向上找，而不是调用的地方向上找
 */

// 如果函数从全局调用，那么this要么指向global，要么指向window（看运行的环境）
var b = 1;
function g1() {
    console.log(this.b); // 这个地方在node环境下显示undefined，在浏览器环境下显示1，因为b会被注册到window对象
}
g1();

var ob1 = {
    a: 103,
    b: function(){
        console.log(this.a);
    }
};

ob1.b();

var ob2 = {
    a: 299
}

// 通过bind换掉this
let nb = ob1.b.bind(ob2);
nb(); //299

// 通过call换掉this
ob1.b.call(ob2); // 299

// 通过apply换掉this
ob1.b.apply(ob2); // 299

// lambda表达式没有this，他的this是父容器对象的this
// 同样表达式没有arguments，他的arguments也是父函数的
let lbFun1 = ()=>{
    console.log(this.a);
}

lbFun1();// undefined

let lb2 = lbFun1.bind(ob2);
lb2(); // undefined

let lbFun3 = {
    a: 181,
    fun: function(){
        let m = ()=>{
            console.log(this.a);
        }
        m();
    }
}

lbFun3.fun(); // 181